package com.cjlgb.design.upms.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.cjlgb.design.common.mybatis.bean.PageBean;
import com.cjlgb.design.common.core.bean.ResultBean;
import com.cjlgb.design.common.mybatis.service.BaseService;
import com.cjlgb.design.upms.api.entity.SysUserInfo;
import org.springframework.util.StringUtils;

import java.util.Collection;
import java.util.Optional;

/**
 * @author WFT
 * @date 2019/8/11
 * description: 后台用户服务层接口
 */
public interface SysUserService extends BaseService<SysUserInfo> {

    /**
     * 根据账号Id列表获取账号信息列表
     * @param accountIds 账号Id列表
     * @return Collection<SysUserInfo>
     */
    default Collection<SysUserInfo> selectByAccountIds(Collection<Long> accountIds){
        return this.list(Wrappers.<SysUserInfo>lambdaQuery().in(SysUserInfo::getAccountId,accountIds));
    }

    /**
     * 根据账号Id获取账号信息
     * @param accountId 账号Id
     * @return SysUserInfo
     */
    default SysUserInfo selectByAccountId(long accountId){
        return this.getOne(Wrappers.<SysUserInfo>lambdaQuery().eq(SysUserInfo::getAccountId,accountId));
    }

   /**
     * 根据用户名修改用户信息
     * @param accountName 用户名
     * @param info 用户信息
     * @return ResultBean
     */
    default ResultBean updateByAccountName(String accountName,SysUserInfo info){
        LambdaUpdateWrapper<SysUserInfo> wrapper = Wrappers.<SysUserInfo>lambdaUpdate()
                .eq(SysUserInfo::getAccountName, accountName);
        if (this.update(info,wrapper)){
            return ResultBean.ok();
        }
        return ResultBean.error("保存失败");
    }

    /**
     * 根据账号名称查询用户信息
     * @param accountName 账号名称
     * @param excludeId 排除此Id
     * @return SysUserInfo
     */
    default SysUserInfo selectByAccountName(String accountName,Long excludeId){
        LambdaQueryWrapper<SysUserInfo> wrapper = Wrappers.lambdaQuery();
        if (null != excludeId){
            wrapper.notIn(SysUserInfo::getAccountId,excludeId);
        }
        wrapper.eq(SysUserInfo::getAccountName, accountName);
        return this.getOne(wrapper);
    }

    /**
     * 分页查询用户信息
     * @param page 分页条件
     * @param params 查询参数
     * @return IPage<SysUserInfo>
     */
    default IPage<SysUserInfo> pagingQuery(PageBean<SysUserInfo> page, SysUserInfo params){
        LambdaQueryWrapper<SysUserInfo> wrapper = Wrappers.lambdaQuery();
        //  过滤部门Id为空的超级管理员账号
        wrapper.isNotNull(SysUserInfo::getDeptId);
        Optional.ofNullable(params).ifPresent(bean -> {
            //  根据部门名称查询
            if (StringUtils.hasText(params.getDeptName())){
                wrapper.eq(SysUserInfo::getDeptName,params.getDeptName());
            }
            //  根据性别查询
            if (null != params.getSex()){
                wrapper.eq(SysUserInfo::getSex,params.getSex());
            }
            //  根据邮箱地址模糊查询
            if (StringUtils.hasText(params.getUserEmail())){
                wrapper.likeRight(SysUserInfo::getUserEmail,params.getUserEmail());
            }
            //  根据手机号码模糊查询
            if (StringUtils.hasText(params.getUserMobile())){
                wrapper.likeRight(SysUserInfo::getUserMobile,params.getUserMobile());
            }
            //  根据用户名模糊查询
            if (StringUtils.hasText(params.getUserName())){
                wrapper.likeRight(SysUserInfo::getUserName,params.getUserName());
            }
            //  根据登录名称模糊查询
            if (StringUtils.hasText(params.getAccountName())){
                wrapper.likeRight(SysUserInfo::getAccountName,params.getAccountName());
            }
        });
        return this.page(page, wrapper);
    }

    /**
     * 创建用户
     * @param userInfo 用户信息
     * @return ResultBean
     */
    ResultBean createUser(SysUserInfo userInfo);

    /**
     * 修改账户的锁定状态
     * @param userInfo 账户信息
     * @return ResultBean
     */
    ResultBean updateLockFlag(SysUserInfo userInfo);

    /**
     * 修改用户信息
     * @param userInfo 用户信息
     * @return ResultBean
     */
    ResultBean updateByAccountId(SysUserInfo userInfo);

    /**
     * 根据Id获取用户信息
     * @param accountId 账号Id
     * @return SysUserInfo
     */
    SysUserInfo selectInfoByAccountId(long accountId);

    /**
     * 根据账号Id批量删除
     * @param accountIds 账号Id列表
     * @return boolean
     */
    default boolean removeByAccountIds(Collection<Long> accountIds){
        return this.remove(Wrappers.<SysUserInfo>lambdaQuery().in(SysUserInfo::getAccountId,accountIds));
    }

    /**
     * 根据账号Id列表删除用户
     * @param accountIds 账号Id列表
     */
    void deleteByAccountIds(Collection<Long> accountIds);
}
